#include <stdio.h>

/*
 * 一道微软亚洲工程院C笔试题及解答
 */

struct S 
{
	int i;
	int *p;
};

int main()
{
	struct S s;
	int * p = &s.i;		// 取成员s.i的地址

	p[0] = 4;	// 设置 s.i 为 4, 因为 p 指向 i 地址, p[0] 指向 i
	p[1] = 3;	// 设置 s.p 为 3, 因为 p[0] 指向 s.i 地址, p[1] 指向 s.p

	s.p = p;	// 重新设置指针 s.p 为 s.i 的地址.

	s.p[1] = 1;	// 置 s.p 指针为 1. 因前面的 s.p 指向 s.i 的地址, 固 s.p[1] 指向 s.p

	// error
	s.p[0] = 2;	// 因为 s.p 指针已经通过前面被设置为 1, 即非法地址, 所以 s.p[0] 想通
				// s.i 显然是非法的.

	/*
	 * 后话
	 *
	 *		故意将 s.p[0] 和 s.p[1] 的访问次序对调,就是想通过设置 s.p[1] 搞死 s.p[0] 的
	 *		相关操作. 如果先执行 s.p[0] = 2, 然后执行 s.p[1] = 1, 那么所有代码都正常通过.
	 *
	 *	在内存中的对应关系:
	 *		|	s.i		|	s.p		|
	 *		|	p[0]	|	p[1]	|
	 *		|	s.p[0]	|	s.p[1]	|
	 */
}








